package pasientlosjen.auth;

import java.io.IOException;

import org.apache.tapestry5.Link;
import org.apache.tapestry5.runtime.Component;
import org.apache.tapestry5.services.ApplicationStateManager;
import org.apache.tapestry5.services.ComponentEventRequestParameters;
import org.apache.tapestry5.services.ComponentRequestFilter;
import org.apache.tapestry5.services.ComponentRequestHandler;
import org.apache.tapestry5.services.ComponentSource;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.apache.tapestry5.services.PageRenderRequestParameters;
import org.apache.tapestry5.services.Response;

import pasientlosjen.entities.BrukerSesjon;

public class KreverInnloggetBrukerFilter implements ComponentRequestFilter {

	private final PageRenderLinkSource renderLinkSource;
	private final ApplicationStateManager applicationStateManager;

	private final ComponentSource componentSource;

	private final Response response;

	public KreverInnloggetBrukerFilter(ApplicationStateManager applicationStateManager,
			PageRenderLinkSource renderLinkSource, ComponentSource componentSource, Response response) {
		this.applicationStateManager = applicationStateManager;
		this.renderLinkSource = renderLinkSource;
		this.componentSource = componentSource;
		this.response = response;
	}

	public void handleComponentEvent(ComponentEventRequestParameters parameters, ComponentRequestHandler handler)
			throws IOException {

		if (ondirigerTilInnloggingssiden(parameters.getActivePageName())) {
			return;
		}

		handler.handleComponentEvent(parameters);

	}

	public void handlePageRender(PageRenderRequestParameters parameters, ComponentRequestHandler handler)
			throws IOException {

		if (ondirigerTilInnloggingssiden(parameters.getLogicalPageName())) {
			return;
		}

		handler.handlePageRender(parameters);
	}

	protected boolean ondirigerTilInnloggingssiden(String pageName) throws IOException {
		boolean skalOmdirigeresTilInnloggingssiden = true;
		skalOmdirigeresTilInnloggingssiden = seOmBrukerErLoggetInnViaSesjonen(skalOmdirigeresTilInnloggingssiden);
		if (!skalOmdirigeresTilInnloggingssiden)
			return false;

		skalOmdirigeresTilInnloggingssiden = sjekkOmSidenKreverInnlogging(pageName, skalOmdirigeresTilInnloggingssiden);

		if (!skalOmdirigeresTilInnloggingssiden)
			return false;

		sendTilInnlogging();

		return true;
	}

	protected void sendTilInnlogging() throws IOException {
		Link link = renderLinkSource.createPageRenderLink("innlogging");

		response.sendRedirect(link);
	}

	protected boolean sjekkOmSidenKreverInnlogging(String pageName, boolean skalOmdirigeresTilInnloggingssiden) {
		Component page = componentSource.getPage(pageName);

		if (!page.getClass().isAnnotationPresent(KreverInnloggetBruker.class)) {
			skalOmdirigeresTilInnloggingssiden = false;
		}
		return skalOmdirigeresTilInnloggingssiden;
	}

	protected boolean seOmBrukerErLoggetInnViaSesjonen(boolean skalOmdirigeresTilInnloggingssiden) {
		if (applicationStateManager.exists(BrukerSesjon.class)
				&& applicationStateManager.get(BrukerSesjon.class).isInnlogget()) {
			skalOmdirigeresTilInnloggingssiden = false;
		}
		return skalOmdirigeresTilInnloggingssiden;
	}
}